﻿package joystick 
{
	import flash.events.EventDispatcher;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
	
	/**
	 * しきい値に設定した時間が経過した時に呼び出される.
	 * タイマーイベント呼び出しと共に内部のタイマーはストップされる。
	 * @eventType flash.events.TimerEvent.TIMER
	 */
	[Event(name = "timer", type = "flash.events.TimerEvent")] 
	
	/**
	 * 接続確認チェック用クラス.
	 * <p>
	 * フレームワーク内部で使用する。
	 * サーバとの接続が正常かチェックする。
	 * 指定した秒数、サーバからの応答が無い場合、 TIMER イベントを発行する。
	 * </p>
	 * @author Hikipuro
	 */
	public class PingChecker extends EventDispatcher
	{
		/**
		 * ソケットの接続タイムアウト時間チェックタイマー.
		 * pingCount の数をチェックする
		 */
		private var timer:Timer;
		
		/**
		 * Ping のカウント.
		 * 閾値を超えるとネットワークに接続されていないものとして切断する
		 * timer の Timer イベントごとに 1 ずつ増える
		 */
		private var pingCount:uint;
		
		/**
		 * Ping が届かなくなってから、イベントを発行するまでの秒数.
		 */
		public var timeout:uint;
		
		/**
		 * コンストラクタ.
		 * @param	timeout	タイムアウト秒数
		 */
		public function PingChecker(timeout:uint) 
		{
			pingCount = 0;
			this.timeout = timeout;
			timer = new Timer(1000);
			timer.addEventListener(TimerEvent.TIMER, onTimer);
		}
		
		/**
		 * タイマー開始.
		 */
		public function start():void 
		{
			timer.start();
		}
		
		/**
		 * タイマー停止.
		 */
		public function stop():void 
		{
			timer.stop();
		}
		
		/**
		 * カウンターリセット.
		 */
		public function reset():void 
		{
			pingCount = 0;
		}
		
		/**
		 * タイマーイベント.
		 * @param	e
		 */
		private function onTimer(e:TimerEvent):void 
		{
			pingCount++;
			// Debug 用
			//trace("pingCount : " + pingCount);
			
			if (pingCount >= timeout) {
				timer.stop();
				dispatchEvent(new TimerEvent(TimerEvent.TIMER));
			}
		}
	}
	
}